home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 33 / Amiga Format AFCD33 (Issue 117, Dec 1998).iso / -seriously_amiga- / graphics / splitmpegppc / src / util.c < prev    next >
C/C++ Source or Header  |  1998-09-07  |  5KB  |  234 lines

  1. /*
  2.  * Copyright (c) 1992 The Regents of the University of California.
  3.  * All rights reserved.
  4.  * 
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice and the following
  8.  * two paragraphs appear in all copies of this software.
  9.  * 
  10.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  13.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  * 
  15.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20.  *
  21.  * I can be contacted via 
  22.  * Email: michael@ecel.uwa.edu.au
  23.  * Post: P.O. Box 506, NEDLANDS WA 6009, AUSTRALIA
  24.  *
  25.  * Amigaversion by Tobias Seiler in 1997
  26.  * Email: tabs@blader.com
  27.  */
  28.  
  29. #include "main.h"
  30. #include "proto.h"
  31.  
  32. /*
  33.  *--------------------------------------------------------------
  34.  *
  35.  * correct_underflow --
  36.  *
  37.  *    Called when buffer does not have sufficient data to 
  38.  *      satisfy request for bits.
  39.  *      Calls get_more_data, an application specific routine
  40.  *      required to fill the buffer with more data.
  41.  *
  42.  * Results:
  43.  *      None really.
  44.  *  
  45.  * Side effects:
  46.  *    buf_length and buffer fields in curVidStream structure
  47.  *      may be changed.
  48.  *
  49.  *--------------------------------------------------------------
  50.  */
  51.  
  52. void correct_underflow()
  53. {
  54.  
  55.   int status;
  56.  
  57.   status = get_more_data( buf_start, max_buf_length, &bufLength, &bitBuffer);
  58.  
  59.   if (status  < 0) {
  60.     longjmp(env,ERR_READ_BITSTREAM);
  61.  
  62.   }else if ((status == 0) && (bufLength < 1)) {
  63.     longjmp(env,ERR_UNEXPECTED_EOF);
  64.  
  65.   }
  66.  
  67.   curBits = *bitBuffer;
  68. }
  69.  
  70. /*
  71.  *--------------------------------------------------------------
  72.  *
  73.  * next_bits --
  74.  *
  75.  *    Compares next num bits to low order position in mask.
  76.  *      Buffer pointer is NOT advanced.
  77.  *
  78.  * Results:
  79.  *    TRUE, FALSE, or error code.
  80.  *
  81.  * Side effects:
  82.  *    None.
  83.  *
  84.  *--------------------------------------------------------------
  85.  */
  86.  
  87. int next_bits(int num, unsigned int mask)
  88. {
  89.   unsigned int stream;
  90.   int ret_value;
  91.  
  92.   /* If no current stream, return error. */
  93.  
  94.   if (BitStream == NULL)
  95.     longjmp(env,ERR_NO_BIT_STREAM);
  96.  
  97.   /* Get next num bits, no buffer pointer advance. */
  98.  
  99.   show_bitsn(num, &stream);
  100.  
  101.   /* Compare bit stream and mask. Set return value toTRUE if equal, FALSE if
  102.      differs. 
  103.   */
  104.  
  105.   if (mask == stream) {
  106.     ret_value = TRUE;
  107.   } else ret_value = FALSE;
  108.  
  109.   /* Return return value. */
  110.  
  111.   return ret_value;
  112. }
  113.  
  114. /*
  115.  *--------------------------------------------------------------
  116.  *
  117.  * next_start_code --
  118.  *
  119.  *    Parses off bitstream until start code reached. When done
  120.  *      next 4 bytes of bitstream will be start code. Bit offset
  121.  *      reset to 0.
  122.  *
  123.  * Results:
  124.  *    Status code.
  125.  *
  126.  * Side effects:
  127.  *    Bit stream irreversibly parsed.
  128.  *
  129.  *--------------------------------------------------------------
  130.  */
  131.  
  132. int next_start_code(void)
  133. {
  134.   int state;
  135.   int byteoff;
  136.   unsigned int data;
  137.  
  138.   /* If no current stream, return error. */
  139.  
  140.   if (BitStream == NULL)
  141.     longjmp(env,ERR_NO_BIT_STREAM);
  142.  
  143.   /* If insufficient buffer length, correct underflow. */
  144.  
  145.   if (bufLength < 2) {
  146.     correct_underflow();
  147.   }
  148.  
  149.   /* If bit offset not zero, reset and advance buffer pointer. */
  150.  
  151.   byteoff = bitOffset % 8;
  152.  
  153.   if (byteoff != 0) {
  154.     bitOffset += (8-byteoff);
  155.     if (bitOffset > 31) {
  156.       bitBuffer++;
  157.       curBits = *bitBuffer;
  158.       bufLength--;
  159.       bitOffset = 0;
  160.     }
  161.   }
  162.  
  163.   /* Set state = 0. */
  164.  
  165.   state = 0;
  166.  
  167.   /* While buffer has data ... */
  168.  
  169.   while(bufLength > 0) {
  170.  
  171.     /* If insufficient data exists, correct underflow. */
  172.  
  173.     if (bufLength < 2) {
  174.       correct_underflow();
  175.     }
  176.  
  177.     /* If next byte is zero... */
  178.  
  179.     get_bits8(&data);
  180.  
  181.     if (data == 0) {
  182.  
  183.       /* If state < 2, advance state. */
  184.  
  185.       if (state < 2) state++;
  186.     }
  187.  
  188.     /* If next byte is one... */
  189.  
  190.     else if (data == 1) {
  191.  
  192.       /* If state == 2, advance state (i.e. start code found). */
  193.  
  194.       if (state == 2) state++;
  195.  
  196.       /* Otherwise, reset state to zero. */
  197.  
  198.       else state = 0;
  199.     }
  200.  
  201.     /* Otherwise byte is neither 1 or 0, reset state to 0. */
  202.  
  203.     else {
  204.       state = 0;
  205.     }
  206.  
  207.     /* If state == 3 (i.e. start code found)... */
  208.  
  209.     if (state == 3) {
  210.  
  211.       /* Set buffer pointer back and reset length & bit offsets so
  212.      next bytes will be beginning of start code. 
  213.       */
  214.  
  215.       bitOffset = bitOffset - 24;
  216.  
  217.       if (bitOffset < 0) {
  218.     bitOffset = 32 + bitOffset;
  219.     bufLength++;
  220.     bitBuffer--;
  221.     curBits = *bitBuffer;
  222.       }
  223.  
  224.       /* Return success. */
  225.  
  226.       return OK;
  227.     }
  228.   }
  229.  
  230.   /* Return underflow error. */
  231.  
  232.   return BUF_UNDERFLOW;
  233. }
  234.